/*
 * common.h
 *
 *  Created on: 10/03/2013
 *      Author: andres
 */

#ifndef COMMON_H_
#define COMMON_H_

#define EPSILON 0.0000005
#define PI 3.14159265

#define MIN(x,y) (x < y? x : y)
#define MAX(x,y) (x > y? x : y)

#define PLOT(x,y,color,imagen) imagen.ima[x][y] = color

typedef struct _color{
		float a,r,g,b;
	} Color;

typedef struct _punto{
	long double x,y,z;
} Punto;
typedef struct _vector{
	Punto dire;
} Vector;
typedef struct _rayo{
	Vector vector;
	Punto ancla;
} Rayo;

//typedef Rayo Luz;
typedef struct _objeto{
	void *obj;
	int tipo;
	Vector (*Normal)(void *,Punto);
	long double Kd, Ka, Ks, Kn, Kt;
	long double o1,o2,o3;
	long double d;
	int textura;
	int bump;
	long double maxBump;
	Color color;
} Objeto;


#define NORMA(vec) sqrtl(vec.dire.x * vec.dire.x + \
						  vec.dire.y * vec.dire.y + \
						  vec.dire.z * vec.dire.z)

#define PRODUCTO_PUNTO(v1, v2) v1.dire.x * v2.dire.x \
		+ v1.dire.y * v2.dire.y + v1.dire.z * v2.dire.z

#define PRODUCTO_CRUZ(v, w)  (Vector) {{ \
								v.dire.y * w.dire.z - w.dire.y * v.dire.z, \
								w.dire.x * v.dire.z - v.dire.x * w.dire.z, \
								v.dire.x * w.dire.y - w.dire.x * v.dire.y \
							}}

#define CREAR_VECTOR(origen,destino) (Vector) {{ \
												 destino.x - origen.x, \
												 destino.y - origen.y, \
												 destino.z - origen.z \
											   }}
#define MULTIPLICA(vector,escalar) (Vector) {{ \
											  vector.dire.x * escalar, \
											  vector.dire.y * escalar, \
											  vector.dire.z * escalar, \
											}}
#define SUMA_VECTOR(v1,v2) (Vector) {{ \
										v1.dire.x + v2.dire.x, \
										v1.dire.y + v2.dire.y, \
 										v1.dire.z + v2.dire.z  \
								     }}
#define RESTA_VECTOR(v1,v2) (Vector) {{ \
										v1.dire.x - v2.dire.x, \
										v1.dire.y - v2.dire.y, \
 										v1.dire.z - v2.dire.z  \
								     }}


typedef struct _intersection{
	long double t;
	Punto Pint;
	Objeto objeto;
	long double d;
} Interseccion;

#endif /* COMMON_H_ */
